package com.aisino.service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.springframework.stereotype.Service;

import com.aisino.entity.TOrderData;
import com.aisino.util.HandleDataUtil;
@Service
public class ChaiFenService {
	static final String maxMoney = "100000";

    static final BigDecimal max = new BigDecimal(maxMoney);

    static final BigDecimal maxChaiFenJe = new BigDecimal("99999");
	
	public static void chaiFen(BigDecimal jshj,int size,List<TOrderData> list,Set<Integer> quchuSet,List<List<TOrderData>> newList) throws Exception{
		if (jshj.compareTo(new BigDecimal(maxMoney)) >= 0) {
            // 查看是否有单行超限,将单行超限的商品按数量拆分
            for (int j = 0; j < size; j++) {
                // 获取一行数据
                TOrderData chuShiMap = list.get(j);
                // 获取单行金额
                BigDecimal danHangJE = chuShiMap.getJE();
                // 如果有单行超限则按数量拆分，单价大于超限金额则数量会拆分出小数点
                if (danHangJE.compareTo(max) >= 0) {
                    // 查看需要多少数量凑足超限金额
                    BigDecimal DJ = chuShiMap.getDJ();
                    int maxNum = maxChaiFenJe.divide(DJ, 10, RoundingMode.HALF_UP).intValue();
                    // 这行数量
                    BigDecimal SL = chuShiMap.getSL();
                    // 将数量分出小数点
                    if (maxNum < 1) {
                        // 对于最大限额的相应小数点数量
                        BigDecimal xiaoShuBigDecimal = maxChaiFenJe.divide(DJ, 10, RoundingMode.HALF_UP);
                        int fen = SL.divide(xiaoShuBigDecimal, 10, RoundingMode.HALF_UP).intValue();
                        // 当数量没超过就继续
                        for (int f = 0; f < fen + 1; f++) {

                            TOrderData mapNewMap = new TOrderData();
                            mapNewMap = (TOrderData) chuShiMap.deepClone();
                            if (f == fen) {
                                // 最后则只有剩余数量
                                BigDecimal lastNumBigDecimal = SL.subtract(xiaoShuBigDecimal.multiply(new BigDecimal(String.valueOf(fen))));
                                mapNewMap.setSL(lastNumBigDecimal);
                                mapNewMap.setJE(lastNumBigDecimal.multiply(DJ).setScale(3,BigDecimal.ROUND_HALF_UP));
                            } else {
                                mapNewMap.setSL(xiaoShuBigDecimal);
                                mapNewMap.setJE(xiaoShuBigDecimal.multiply(DJ).setScale(3,BigDecimal.ROUND_HALF_UP));
                            }
                            // 把新的明细行加入原有集合
                            list.add(mapNewMap);
                        }
                        // 记录待剔除明细行，后面剔除
                        quchuSet.add(j);
                    } else {

                        // 查看这个数量可以分成几份
                        int fen = SL.divide(new BigDecimal(String.valueOf(maxNum)), 10, RoundingMode.HALF_UP).intValue();
                        for (int f = 0; f < fen + 1; f++) {
                            TOrderData mapNewMap = new TOrderData();
                            mapNewMap = (TOrderData) chuShiMap.deepClone();
                            // 最后的时候加上剩余数量
                            if (f == fen) {
                                BigDecimal lastNumBigDecimal = SL.subtract(new BigDecimal(String.valueOf(fen * maxNum)));
                                mapNewMap.setSL(lastNumBigDecimal);
                                mapNewMap.setJE(lastNumBigDecimal.multiply(DJ).setScale(3,BigDecimal.ROUND_HALF_UP));
                            } else {
                                // 往里面加一个数量为maxNum的商品行
                                mapNewMap.setSL(new BigDecimal(maxNum));
                                // 数据库设置自动四舍五入
                                mapNewMap.setJE(DJ.multiply(new BigDecimal(String.valueOf(maxNum))).setScale(3,BigDecimal.ROUND_HALF_UP));
                            }
                            // 把新的明细行加入原有集合
                            list.add(mapNewMap);
                        }
                        // 记录待剔除明细行，后面剔除
                        quchuSet.add(j);
                    }
                }
            }

            // 使用迭代器去除超限明细行
            deleteYuanSu(list);

            // 查看原有list
            System.out.println("巨大金额结果" + list);

            // 将发票拆分出几张发票
            HandleDataUtil.chaifenHang(list, newList);
        }else{
        	// 如果需要拆分
        	newList.add(list);
        }
	}
	
	// 删除超限元素
	public static void deleteYuanSu(List<TOrderData> list){
		Iterator<TOrderData> it = list.iterator();
        while (it.hasNext()) {
            TOrderData mapTemp = it.next();
            BigDecimal temp = mapTemp.getJE();
            if (temp.compareTo(max) >= 0) {
                System.out.println("     " + mapTemp.getJE());
                it.remove();
            }
        }
	}
}
